<?php

/**
 * Smarty Internal Plugin Filter Handler
 *
 * Smarty filter handler class
 *
 * @package Smarty
 * @subpackage PluginsInternal
 * @author Uwe Tews
 */

/**
 * Class for filter processing
 */
class Smarty_Internal_Filter_Handler {
	/**
	 * Run filters over content
	 *
	 * The filters will be lazy loaded if required
	 * class name format: Smarty_FilterType_FilterName
	 * plugin filename format: filtertype.filtername.php
	 * Smarty2 filter plugins could be used
	 *
	 * @param string $type the type of filter ('pre','post','output' or 'variable') which shall run
	 * @param string $content the content which shall be processed by the filters
	 * @return string the filtered content
	 */
	static function runFilter($type, $content, $template, $flag = null) {
		$output = $content;
		if ($type != 'variable' || ($template->smarty->variable_filter && $flag !== false) || $flag === true) {
			// loop over autoload filters of specified type
			if (! empty ( $template->smarty->autoload_filters [$type] )) {
				foreach ( ( array ) $template->smarty->autoload_filters [$type] as $name ) {
					$plugin_name = "Smarty_{$type}filter_{$name}";
					if ($template->smarty->loadPlugin ( $plugin_name )) {
						if (function_exists ( $plugin_name )) {
							// use loaded Smarty2 style plugin
							$output = $plugin_name ( $output, $template );
						} elseif (class_exists ( $plugin_name, false )) {
							// loaded class of filter plugin
							$output = call_user_func ( array ($plugin_name, 'execute' ), $output, $template );
						}
					} else {
						// nothing found, throw exception
						throw new SmartyException ( "Unable to load filter {$plugin_name}" );
					}
				}
			}
			// loop over registerd filters of specified type
			if (! empty ( $template->smarty->registered_filters [$type] )) {
				foreach ( $template->smarty->registered_filters [$type] as $key => $name ) {
					if (is_array ( $template->smarty->registered_filters [$type] [$key] )) {
						$output = call_user_func ( $template->smarty->registered_filters [$type] [$key], $output, $template );
					} else {
						$output = $template->smarty->registered_filters [$type] [$key] ( $output, $template );
					}
				}
			}
		}
		// return filtered output
		return $output;
	}
}

?>